home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / NEW_DEF / OBJHANDL.D next >
Encoding:
Modula Definition  |  1994-01-11  |  21.7 KB  |  518 lines

  1. DEFINITION MODULE ObjHandler;
  2.  
  3.  
  4. (*      Megamax Modula-2 GEM-Library: ObjectHandler
  5.  *
  6.  *      geschrieben von Manuel Chakravarty
  7.  *
  8.  *      Version 2.1     V#0068      Created 30.06.1987
  9.  *)
  10.  
  11.  
  12.                     (*  Operationen auf Objektbäume  *)
  13.                     (*  ===========================  *)
  14.                         
  15.                         
  16.   (*  Die folgenden Routinen stellen ein Paket dar, das die Möglichkeit
  17.    *  bieten soll in eleganter Art und Weise auf die Objektbaumstrukturen
  18.    *  des GEM zuzugreifen. Die Sammlung wurde notwendig, da es die Struk-
  19.    *  tur des Baumes nicht erlaubt, ihn 'anständig' in Modula-Datentypen
  20.    *  zu fassen und andererseits Zugriffe über GEM-Funktionen nur unzu-
  21.    *  reichend möglich sind.
  22.    *  Die Routinen fangen Fehler, soweit es möglich ist ab und melden sie
  23.    *  bei Anfrage über 'ObjTreeError' an das aufrufende Modul. Allerdings
  24.    *  können Fehler, wie falsch übergebene Baumadressen und Zugriff auf un-
  25.    *  definierte Elemente in der Regel nicht erkannt werden.
  26.    *  Folgende Situationen lösen immer einen Fehler aus:
  27.    *
  28.    *     -- Zugriff auf ein Objekt während der momentane Baum mit 'NIL'
  29.    *        besetzt ist.
  30.    *     -- Zugriff auf ein Objekt, dessen Index größer als der des letzten
  31.    *        Objekts ist
  32.    *     -- Zugriff auf ein Objekt mit einer Prozedur, die mit dem Objekt-
  33.    *        typ nicht verträglich ist.
  34.    *
  35.    *  Die Operationen werden immer auf einen vorher festgelegten Baum ange-
  36.    *  wendet, dieser Baum wird im folgenden mit 'momentaner Baum' bezeich-
  37.    *  net. Die Ermittlung des momentanen Baumes geschieht mit Hilfe von
  38.    *  'CurrObjTree', mit einer entsprechenden Prozedur kann er auch gesetzt
  39.    *  werden.
  40.    *  Der erste Parameter der meisten Proceduren ist das Objekt, auf das die
  41.    *  Routine angewendet werden soll. Dieser Parameter heißt immer 'obj'
  42.    *  und ist vom Typ 'CARDINAL'.
  43.    *  Es bedeutet ein Wert von 'NIL', daß kein Baum vorhanden ist.
  44.    *  Die Objektbaumstruktur ist in 'GEMGlobals' definiert.
  45.    *)
  46.                         
  47.                         
  48. FROM SYSTEM     IMPORT WORD, LONGWORD;
  49.  
  50. FROM MOSGlobals IMPORT MemArea;
  51.  
  52. FROM GrafBase   IMPORT Point, Rectangle, PtrBitPattern;
  53.  
  54. FROM GEMGlobals IMPORT PtrObjTree, ObjType, OStateSet, OFlagSet, PtrObjSpec,
  55.                        THorJust, PtrMaxStr;
  56.  
  57.  
  58. PROCEDURE ObjTreeError (): BOOLEAN;
  59.  
  60.         (*  Es wird 'TRUE' geliefert, falls bei der LETZTEN Baumoperation
  61.          *  ein Fehler auftratt (zum Beispiel Aufruf während der momen-
  62.          *  tane Baum 'NIL' ist).
  63.          *)
  64.  
  65. PROCEDURE CreateObjTree (    noElements: CARDINAL;
  66.                              sys       : BOOLEAN;
  67.                          VAR success   : BOOLEAN);
  68.  
  69.         (*  Erzeugt einen Objektbaum, der 'noElements' Elemente enthält.
  70.          *  Der erzeugte Baum ist danach der momentane Baum und alle Ele-
  71.          *  mente des Baumes befinden sich in einem undefinierten Zustand.
  72.          *  Ist nicht genug Speicher vorhanden, so ist 'success = FALSE'.
  73.          *
  74.          *  Ist 'sys = TRUE', so wird ein Systembaum erzeugt, das heißt
  75.          *  alle Speicheranforderungen laufen über 'Storage.SysAlloc'.
  76.          *)
  77.          
  78. PROCEDURE DeleteObjTree;
  79.  
  80.         (*  Gibt den Speicher des mom. Baumes und all seiner Objektspezi-
  81.          *  fikationen frei. Spezifikationen die 'NIL' sind werden ignoriert.
  82.          *)
  83.  
  84. PROCEDURE SetCurrObjTree (tree: PtrObjTree; sys: BOOLEAN);
  85.  
  86.         (*  Danach ist 'tree' der momentane Baum. Ist 'sys = TRUE', so
  87.          *  wird angenommen, das ein Systembaum übergeben wurde (Siehe
  88.          *  'CreateObjTree').
  89.          *  Das letzte Objekt (das mit dem höchsten Index) muß das Objekt-
  90.          *  flag 'lastObjFlg' besitzen!
  91.          *)
  92.          
  93. PROCEDURE CurrObjTree (): PtrObjTree;
  94.  
  95.         (*  Liefert einen Zeiger auf den momentanen Baum.
  96.          *)
  97.         
  98. PROCEDURE LastObject (): CARDINAL;
  99.  
  100.         (*  Liefert den Index des letzten Baumelements, d.h das welches den
  101.          *  höchsten Index besitzt.
  102.          *)
  103.          
  104. PROCEDURE SetObjType (obj: CARDINAL; type: ObjType);
  105.  
  106.         (*  Legt Objekttyp des Objektes 'obj' fest.
  107.          *)
  108.         
  109. PROCEDURE ObjectType (obj: CARDINAL): ObjType;
  110.  
  111.         (*  Liefert Objekttyp des Objektes 'obj'.
  112.          *)
  113.          
  114. PROCEDURE SetObjFlags (obj: CARDINAL; flags: OFlagSet);
  115.  
  116.         (*  Setzt die Flags des Objektes 'obj' auf 'flags'.
  117.          *)
  118.         
  119. PROCEDURE ObjectFlags (obj: CARDINAL): OFlagSet;
  120.  
  121.         (*  Liefert die Flags des Objektes 'obj'.
  122.          *)
  123.         
  124. PROCEDURE SetObjState (obj: CARDINAL; state: OStateSet);
  125.  
  126.         (*  Setzt den Objektstatus auf 'state'.
  127.          *)
  128.         
  129. PROCEDURE ObjectState (obj: CARDINAL): OStateSet;
  130.  
  131.         (*  Liefert den Objektstatus des Objektes 'obj'.
  132.          *)
  133.         
  134. PROCEDURE SetObjSpace (obj: CARDINAL; space: Rectangle);
  135.  
  136.         (*  Legt den Bereich den das Objekt ausfüllt fest.
  137.          *)
  138.         
  139. PROCEDURE ObjectSpace (obj: CARDINAL): Rectangle;
  140.  
  141.         (*  Ermittelt den vom momentanen Objekt belegten Bildschirmbereich.
  142.          *)
  143.         
  144. PROCEDURE SetObjRelatives (obj: CARDINAL; next, head, tail: CARDINAL);
  145.  
  146.         (*  Legt die 3 Zeiger auf verwandte Objekte fest. 'next' zeigt auf
  147.          *  den nächsten Bruder (oder falls keiner vorhanden ist auf den
  148.          *  Vorgänger), 'head' zeigt auf den ersten Nachfolger und 'tail'
  149.          *  auf den Letzte. 'NoObject' zeigt dabei jeweils an, daß das ent-
  150.          *  sprechende Objekt nicht existiert (z.B. 'next = NoObject' bedeu-
  151.          *  tet, es existiert weder Bruder noch Vorgänger, das Objekt ist al-
  152.          *  so die Baumwurzel).
  153.          *)
  154.          
  155. PROCEDURE GetObjRelatives (obj: CARDINAL; VAR next, head, tail: CARDINAL);
  156.  
  157.         (*  Liest die von 'SetObjRelatives' gesetzten Werte.
  158.          *)
  159.         
  160. PROCEDURE Parent (obj: CARDINAL): CARDINAL;
  161.  
  162.         (*  Es wird der Vorgänger des Objektes 'obj' zurückgegeben.
  163.          *  Ein Fehler tritt auf, falls 'obj' die Wurzel des Baumes ist.
  164.          *)
  165.          
  166. PROCEDURE LeftSister (obj: CARDINAL): CARDINAL;
  167.  
  168.         (*  Es wird der linke Nachbar des Objektes 'obj' ermittelt.
  169.          *  Ist 'obj' das erste Element der Nachfolgerliste des Vorgängers,
  170.          *  so tritt ein Fehler auf.
  171.          *)
  172.          
  173. PROCEDURE RightSister (obj: CARDINAL): CARDINAL;
  174.  
  175.         (*  Es wird der rechte Nachbar ermittelt.
  176.          *  Ist 'obj' das letzte Element der Nachfolgerliste, so tritt ein
  177.          *  Fehler auf.
  178.          *)
  179.          
  180. PROCEDURE CreateSpecification (obj: CARDINAL; spec: PtrObjSpec);
  181.  
  182.         (*  Die Objektspezifikation des Objekts 'obj' wird erzeugt.
  183.          *  Die Routine arbeitet in zwei Modi:
  184.          *
  185.          *  'spec=NIL' -- Falls die Objektspezifikation des Objekts ein
  186.          *                Zeiger auf eine Struktur ist, z.B. 'TEdInfo',
  187.          *                so wird diese Struktur alloziert und ihre Adres-
  188.          *                se eingetragen, sonst wird die Objektspezifika-
  189.          *                tion einfach gelöscht.
  190.          *                Ist das 'indirectFlg'-Flag des Objekts gesetzt,
  191.          *                so wird zuerst eine neue Spezifikation alloziert
  192.          *                und dann wie oben verfahren.
  193.          *  'spec#NIL' -- Es wird 'spec^' als zu setzende Spezifikation be-
  194.          *                trachted und somit in das Objekt eingetragen. Ist
  195.          *                das 'indirectFlg'-Flag gesetzt, so wird 'spec',
  196.          *                eingtragen ('spec' ist ein Zeiger auf eine Spezi-
  197.          *                fikation).
  198.          *                Hinweis: Die Routine ist während der Laufzeit
  199.          *                         nicht in der Lage zu überprüfen, ob die
  200.          *                         gesetzte Objektspezifikation mit dem
  201.          *                         Objekttyp verträglich ist.
  202.          *
  203.          *  Achtung: Zum Zeitpunkt des Aufrufs dieser Routine muß der Typ
  204.          *           des Objekts 'obj' und der Wert des 'indirectFlg', aus
  205.          *           den Objektflags, schon gesetzt sein.
  206.          *)
  207.  
  208. PROCEDURE SetBoxChar (obj: CARDINAL; ch: CHAR);
  209.  
  210.         (*  Es wird das Zeichen eines 'boxCharObj'-Objekts mit 'ch' besetzt.
  211.          *)
  212.          
  213. PROCEDURE BoxChar (obj: CARDINAL): CHAR;
  214.  
  215.         (*  Das Zeichen des 'boxCharObj'-Objekts wird ermittelt.
  216.          *)
  217.         
  218.         
  219. TYPE    SignedByte      = [-128..127];
  220.  
  221. PROCEDURE SetBorderThickness (obj: CARDINAL; thick: SignedByte);
  222.  
  223.         (*  Die Randstärke des Objektes wird auf 'thick' gesetzt.
  224.          *)
  225.          
  226. PROCEDURE BorderThickness (obj: CARDINAL): SignedByte;
  227.  
  228.         (*  Die Randstärke eines Objekts wird ermittelt.
  229.          *)
  230.         
  231. PROCEDURE SetComplexColor (obj        : CARDINAL;
  232.                            borderCol,
  233.                            textCol,
  234.                            fillCol,
  235.                            fillDensity: CARDINAL;
  236.                            opaque     : BOOLEAN);
  237.                            
  238.         (*  Mit dieser Routine wird die Farbgebung aller Objekttypen, aus-
  239.          *  genommen 'imageObj', 'iconObj', 'progDefObj', 'stringObj' und
  240.          *  'titleObj', 'buttonObj', festgelegt.
  241.          *  Dabei ist 'borderCol' die Farbe des Randes, 'textCol' die, in
  242.          *  der Text erscheinen soll und 'fillCol' die Füllfarbe.
  243.          *  'fillDensity' gibt die Intensität des Füllmusters an, dabei be-
  244.          *  deutet 0 keine Füllung und 7 vollständige Füllung. Mit 1 bis 6
  245.          *  erzeugt man ein immer dichter werdendes Punktmuster.
  246.          *  'opaque' gibt den Schreibmodus des Textes an, dabei es steht
  247.          *  'TRUE' für überdeckend und 'FALSE' für transparent.
  248.          *)
  249.          
  250. PROCEDURE GetComplexColor (    obj        : CARDINAL;
  251.                            VAR borderCol,
  252.                                textCol,
  253.                                fillCol,
  254.                                fillDensity: CARDINAL;
  255.                            VAR opaque     : BOOLEAN);
  256.                           
  257.         (*  Erfragt die mit 'SetComplexColor' gesetzten Werte.
  258.          *)
  259.         
  260. PROCEDURE SetIconColor (obj: CARDINAL; foreGround, backGround: CARDINAL);
  261.  
  262.         (*  Setzt die Vordergrund 'foreGround' und Hintergrund 'backGround'
  263.          *  Farben von Objekten des Typs 'iconObj'.
  264.          *)
  265.          
  266. PROCEDURE GetIconColor (obj: CARDINAL; VAR foreGround, backGround: CARDINAL);
  267.  
  268.         (*  Ermittelt die mit 'SetIconColor' gesetzten Farben.
  269.          *)
  270.         
  271. PROCEDURE SetImageColor (obj: CARDINAL; color: CARDINAL);
  272.  
  273.         (*  Legt die Farbe fest, in der die gesetzten Punkte des Bitmusters
  274.          *  eines 'imageObj'-Objekts dargestellt werden sollen.
  275.          *)
  276.          
  277. PROCEDURE GetImageColor (obj: CARDINAL; VAR color: CARDINAL);
  278.  
  279.         (*  Liefert die mit 'SetImageColor' festgelegte Farbe.
  280.          *)
  281.         
  282. PROCEDURE SetTextForm (obj: CARDINAL; font: CARDINAL; just: THorJust);
  283.  
  284.         (*  Legt den Zeichensatz 'font' und die Textausrichtung 'just' des
  285.          *  Objektes 'obj' fest, welches als Spezifikation eine 'TEdInfo'-
  286.          *  Struktur besitzen muß.
  287.          *  Als Zeichensatz kann man 'SmallFont' oder 'StandardFont' wählen.
  288.          *  Wird aus 'GEMGlobals' importiert.
  289.          *)
  290.          
  291. PROCEDURE GetTextForm (obj: CARDINAL; VAR font: CARDINAL; VAR just: THorJust);
  292.  
  293.         (*  Liefert die mit 'SetTextForm' gesetzten Parameter.
  294.          *)
  295.         
  296. PROCEDURE SetIconForm (obj      : CARDINAL;
  297.                        charPos  : Point;
  298.                        iconFrame,
  299.                        textFrame: Rectangle);
  300.                        
  301.         (*  Hiermit bestimmt man bei Objekten vom Typ 'iconObj' die Position
  302.          *  des Zeichens mit 'charPos', den Rahmen in dem das Piktogramm
  303.          *  liegt mit 'iconFrame' und das Rechteck, das den Text umschließt,
  304.          *  mit 'textFrame'.
  305.          *  Alle Angaben werden in Pixeln gemacht und sind relativ zu dem
  306.          *  Rahmen des Gesamtobjekts.
  307.          *)
  308.          
  309. PROCEDURE GetIconForm (    obj      : CARDINAL;
  310.                        VAR charPos  : Point;
  311.                        VAR iconFrame,
  312.                            textFrame: Rectangle);
  313.                        
  314.         (*  Ermittelt die mit 'SetIconForm' festgelegten Werte.
  315.          *)
  316.         
  317. PROCEDURE SetImageForm (obj      : CARDINAL;
  318.                         byteWidth,
  319.                         height,
  320.                         deltaX,
  321.                         deltaY   : INTEGER);
  322.  
  323.         (*  Für Objekte vom Typ 'imageObj gibt 'byteWidth' die Breite des
  324.          *  Bitmusters in Bytes an und muß eine gerade Zahl sein. 'height'
  325.          *  ist die Höhe des Bitmusters in Pixeln und 'deltaX' bzw. 'deltaY'
  326.          *  geben je einen Offset an, der festlegt wieviel Pixel, vom linken
  327.          *  bzw. oberen Rand des Bitmusters entfernt mit dem Darstellen des-
  328.          *  selbigen begonnen werden soll.
  329.          *)
  330.          
  331. PROCEDURE GetImageForm (    obj      :CARDINAL;
  332.                         VAR byteWidth,
  333.                             height,
  334.                             deltaX,
  335.                             deltaY   :INTEGER);
  336.                         
  337.         (*  Erfragt die mit 'SetImageForm' festgelegten Werte.
  338.          *)
  339.         
  340. TYPE    SetPtrChoice    = (create, setOnly, reCreate, noChange);
  341.  
  342.          (*  Beim Setzen von Pointervariblen kann man mit einem Parameter
  343.           *  des obigen Typs wählen, ob die Variable neu alloziert werden
  344.           *  oder ob sie nur einen neuen Wert erhalten soll.
  345.           *
  346.           *  'create'   -- Variable neu allozieren
  347.           *  'setOnly'  -- Nur Wert zuweisen
  348.           *  'reCreate' -- Alte Variable deallozieren und dann
  349.           *                wie bei 'create' verfahren
  350.           *  'noChange' -- Die Variable wird nicht beeinflußt
  351.           *)
  352.  
  353. PROCEDURE AssignTextStrings
  354.                        ( obj: CARDINAL;
  355.                          textChoice : SetPtrChoice; REF textS: ARRAY OF CHAR;
  356.                          tmpltChoice: SetPtrChoice; REF tmplt: ARRAY OF CHAR;
  357.                          validChoice: SetPtrChoice; REF valid: ARRAY OF CHAR );
  358.  
  359.         (*  Hiermit werden die Strings einer 'TEdInfo'-Struktur gesetzt, dabei
  360.          *  kann mit Hilfe der '...Choice'-Parameter gewählt werden, ob der
  361.          *  String neu allociert werden oder nur mit einem Wert besetzt werden
  362.          *  soll (Siehe oben).
  363.          *  Es wird 'textS' der Zeichenkette zugewiesen, die den Text enthält;
  364.          *  'tmplt' ist für die Maske und 'valid' für den String, der die
  365.          *  erlaubten Zeichen enthält.
  366.          *  'TEdInfo.tmpltLen' bekommt die Länge von 'tmplt' zugewiesen und
  367.          *  'TedInfo.textLen' die von 'valid'.
  368.          *  Außerdem kann mit dieser Routine die Zeichenkette von Objekten
  369.          *  des Typ 'buttonObj', 'stringObj' oder 'titleObj' gesetzt werden,
  370.          *  dazu müssen aber 'tmpltChoice' und 'validChoice' den Wert
  371.          *  'noChange' enthalten, sonst wird ein Fehler ausgelöst (Siehe
  372.          *  'ObjTreeError').
  373.          *)
  374.          
  375. PROCEDURE LinkTextString (obj: CARDINAL; str: PtrMaxStr);
  376.  
  377.         (*  Diese Routine weißt der Textzeichenkette eines 'TEdInfo'-RECORDs
  378.          *  nicht einfach einen Wert zu, sondern es wird die Adresse des
  379.          *  angegebene Strings 'str' eingetragen.
  380.          *  Ist das so veränderte Objekt edierbar, so werden alle Änderungen
  381.          *  direkt in dieser Zeichenkette vorgenommen.
  382.          *)
  383.  
  384. PROCEDURE GetTextStrings (    obj  : CARDINAL;
  385.                           VAR textS,
  386.                               tmplt,
  387.                               valid: ARRAY OF CHAR);
  388.  
  389.         (*  Liefert die mit 'AssignTextStrings' gesetzten Strings zurück.
  390.          *)
  391.         
  392. PROCEDURE SetStringLength (obj: CARDINAL; textLen, tmpltLen: CARDINAL);
  393.  
  394.         (*  Erlaubt es 'TedInfo.textLen/tmpltLen' zu setzen.
  395.          *)
  396.         
  397. PROCEDURE GetStringLength (obj: CARDINAL; VAR textLen, tmpltLen: CARDINAL);
  398.  
  399.         (*  Erfragt die von 'SetStringLength' gesetzten Werte.
  400.          *)
  401.         
  402. PROCEDURE SetImagePattern (obj: CARDINAL; pattern: PtrBitPattern);
  403.  
  404.         (*  Legt das Bitmuster des Objekts 'obj', welches vom typ 'imageObj'
  405.          *  sein muß fest.
  406.          *)
  407.          
  408. PROCEDURE GetImagePattern (obj: CARDINAL; VAR pattern: PtrBitPattern);
  409.  
  410.         (*  Liefert einen Zeiger auf das Bitmuster von 'obj'.
  411.         *)
  412.         
  413. PROCEDURE SetIconLook (    obj   : CARDINAL;
  414.                            data,
  415.                            mask  : PtrBitPattern;
  416.                            choice: SetPtrChoice;
  417.                        REF str   : ARRAY OF CHAR;
  418.                            ch    : CHAR);
  419.  
  420.         (*  Einem Objekt vom Typ 'iconObj' wird der Zeiger auf das Daten-
  421.          *  bitmuster ('data') und die Maske ('mask') zugewiesen. Außerdem
  422.          *  wird die Bildunterschrift des Icons mit 'str' besetzt. Dabei
  423.          *  bestimmt 'choice' auf welche Art die Zeichenkette eingetragen
  424.          *  wird (Siehe 'SetPtrChoice'). Schlußendlich wird 'ch' zu dem
  425.          *  im Piktogramm erscheienden Zeichen.
  426.          *)
  427.                       
  428. PROCEDURE GetIconLook (    obj :CARDINAL;
  429.                        VAR data,
  430.                            mask:PtrBitPattern;
  431.                        VAR str :ARRAY OF CHAR;
  432.                        VAR ch  :CHAR);
  433.                       
  434.         (*  Erfragt die von 'SetIconLook' gesetzten Parameter.
  435.          *)
  436.          
  437.          
  438. (*      Die folgenden Routinen sind für eine ganz besondere Sorte von
  439.  *      Objekten gedacht, für die vom Programmierer selbstdefinierten
  440.  *      Objekte ("user defined objects").
  441.  *      Wann immer ein solches Objekt auf dem Bildschirm dargestellt wird oder
  442.  *      dessen Objektstatus verändert werden soll, wird eine selbstdefinier-
  443.  *      bare Routine aufgerufen. Diese kann, mit Hilfe der VDI-Funktionen,
  444.  *      die Gestaltung des Objektes in eigener Regie übernehmen. Dazu werden
  445.  *      der Prozedur, die vom Typ 'ProgDefProc' sein muß, der Baum 'tree'
  446.  *      und der Objektindex ('index') des darzustellenden Objekts überge-
  447.  *      ben. Außerdem werden ihr, falls nur der Objektstatus geändert werden
  448.  *      soll, der alte ('prevState') und der neue Status ('curState') übergeben.
  449.  *      Sind die beiden gleich, so heißt dies, daß das Objekt komplett neu
  450.  *      gezeichnet werden muß. 'space' gibt die Größe des Objekts an und
  451.  *      'clip' sagt, welcher Bereich beim Zeichnen nicht verlassen werden darf.
  452.  *      Letztlich wird in 'parm' ein Langwort geliefert, das beim Baumaufbau
  453.  *      angegeben werden muß und dessen Verwendung dem Programmierer überlas-
  454.  *      sen ist. Als Rückgabewert muß die selbstdefinierte Routine die Zustände
  455.  *      liefern, die noch vom AES gesetzt werden sollen (Es wird dann die
  456.  *      normale Vorgehensweise gewählt, wird zum Beispiel 'selectFlg' gelie-
  457.  *      fert, so wird die Zeichnung invertiert).
  458.  *
  459.  *      Hinweis: Da das AES nicht reentrant-fähig ist, sollte auf AES-Aufrufe
  460.  *               in einer solchen Objektbaumprozedur verzichtet werden.
  461.  *
  462.  *      Eine Demo-Anwendung hierfür findet sich im DEMO-Ordner (PROGDEFD.M).
  463.  *)
  464.         
  465.         
  466. TYPE    ProgDefProc     = PROCEDURE((* tree     : *) PtrObjTree,
  467.                                     (* index    : *) CARDINAL,
  468.                                     (* prevState: *) OStateSet,
  469.                                     (* curState : *) OStateSet,
  470.                                     (* space    : *) Rectangle,
  471.                                     (* clip     : *) Rectangle,
  472.                                     (* parm     : *) LONGWORD  ): OStateSet;
  473.                                     
  474.         ProgDefCarrier  = ARRAY[0..15] OF WORD;
  475.  
  476.  
  477. PROCEDURE MakeProgDefProc (VAR hdl : ProgDefCarrier;
  478.                                proc: ProgDefProc;
  479.                                wsp : MemArea       );
  480.                            
  481.         (*  Macht die Prozedur 'proc' zu einer Routine, die in einer Objekt-
  482.          *  baumstruktur angegeben werden kann. Dieser Vorgang muß nicht
  483.          *  rückgänig gemacht werden (auch nicht bei der Programmterminierung)
  484.          *  und beeinflußt die Funktionweise von 'proc' in keiner Weise.
  485.          *  Es ist 'hdl' nach dem Aufruf Kennung für die Prozedur und Spei-
  486.          *  cherbereich für systeminterne Daten. 'hdl' muß global definiert
  487.          *  sein und darf weder anderweitig benutzt, noch irgendwie freige-
  488.          *  geben werden. Erst wenn kein Objektbaum mehr existiert, der 'proc'
  489.          *  enthält und auch kein solcher mehr erstellt werden soll, ist 'hdl'
  490.          *  wieder frei.
  491.          *  Das Gleiche gilt für den in 'wsp' beschriebenen Speicherbereich,
  492.          *  der von 'proc' als Stack benutzt wird.
  493.          *  Eine Demo hierfür findet sich im DEMO-Ordner (PROGDEFD.M).
  494.          *)
  495.                            
  496. PROCEDURE SetProgDefSpec (    obj : CARDINAL;
  497.                           VAR hdl : ProgDefCarrier;
  498.                               parm: LONGWORD);
  499.  
  500.         (*  Das Objekt 'obj', welches vom Typ 'progDefObj' sein muß, bekommt
  501.          *  die durch 'hdl' beschriebene Prozedur und den Parameter 'parm'
  502.          *  zugewiesen.
  503.          *  Zu 'hdl' siehe 'MakeProgDefProc'.
  504.          *  Eine Demo hierfür findet sich im DEMO-Ordner (PROGDEFD.M).
  505.          *)
  506.  
  507. PROCEDURE GetProgDefSpec (    obj : CARDINAL;
  508.                           VAR proc: ProgDefProc;
  509.                           VAR parm: LONGWORD);
  510.         
  511.         (*  Erfragt die mit 'SetProgDefSpec' gesetzten Werte, dabei wird al-
  512.          *  lerdings statt des 'ProgDefCarrier's die Procedure 'proc' über-
  513.          *  geben, mit welcher der 'ProgDefCarrier' initialisiert wurde.
  514.          *)
  515.  
  516.  
  517. END ObjHandler.
  518.